##########################################################################
#
#  Copyright (c) 2015, Image Engine Design Inc. All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions are
#  met:
#
#      * Redistributions of source code must retain the above
#        copyright notice, this list of conditions and the following
#        disclaimer.
#
#      * Redistributions in binary form must reproduce the above
#        copyright notice, this list of conditions and the following
#        disclaimer in the documentation and/or other materials provided with
#        the distribution.
#
#      * Neither the name of John Haddon nor the names of
#        any other contributors to this software may be used to endorse or
#        promote products derived from this software without specific prior
#        written permission.
#
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
#  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
#  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
#  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
#  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
#  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
#  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
#  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
#  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
#  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
##########################################################################

import functools

import IECore

import Gaffer
import GafferUI

import GafferImage

## \todo Add buttons for removing existing ChannelPlugs, and for adding
# extras. This is probably best done as part of a concerted effort to
# support layers everywhere (we can already compute arbitrary numbers of
# named channels, we just need a convention and a UI for presenting this
# as layers).

Gaffer.Metadata.registerNode(

	GafferImage.Shuffle,

	"description",
	"""
	Shuffles data between image channels, for instance by copying R
	into G or a constant white into A.
	""",

	plugs = {

		"missingSourceMode" : {

			"description" :
			"""
			Determines behaviour when the source channel doesn't exist :

			- Ignore : No change is made to the destination channel.
			- Error : The node errors.
			- Black : Black is shuffled into the destination channel.

			> Note : Does not apply when source contains wildcards.
			""",

			"plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget",
			"preset:Ignore" : GafferImage.Shuffle.MissingSourceMode.Ignore,
			"preset:Error" : GafferImage.Shuffle.MissingSourceMode.Error,
			"preset:Black" : GafferImage.Shuffle.MissingSourceMode.Black,

			"layout:divider" : True,

		},

		"shuffles" : {

			"description" :
			"""
			The definition of the shuffling to be performed - an
			arbitrary number of channel edits can be made by adding
			ShufflePlugs as children of this plug.
			""",

		},

		"shuffles.*.source" : {

			"plugValueWidget:type" : "GafferImageUI.ChannelPlugValueWidget",
			"channelPlugValueWidget:extraChannels" : IECore.StringVectorData( [ "__white", "__black" ] ),
			"channelPlugValueWidget:extraChannelLabels" : IECore.StringVectorData( [ "White", "Black" ] ),

		},

		"shuffles.*.destination" : {


			"plugValueWidget:type" : "GafferImageUI.ChannelPlugValueWidget",
			"channelPlugValueWidget:allowNewChannels" : True,

		},

	}

)